import PointPath = require('./PointPath');
import Point = require('./Point');
export = CompoundPath;

/**
 * 复合路径
 * @author jackliu
 *
 */
class CompoundPath {
    
    // 包含多个简单路径
    public paths:Array<PointPath>= new Array<PointPath>();
    public w:number=0;
    public h:number=0;
    // 此x和y可以忽略不计。
    public x:number=0;
    public y:number=0;
     
    public constructor() {
    }
	
    // 转成json字符串
    // 参数： frame为true，表示转成frame（所谓frame指的是文字的每个字的x、y、w、h，matrix但不包括文字的每个点）
    public toJson  (){
        
        
        var ret = '{';
            
        
        ret +='"paths":[';
        for(var i=0;i<this.paths.length;i++){
            if(i>0){
                ret +=',';
            }
            ret += this.paths[i].toJson();
        }
        ret +=']';
        ret +=',';
       
        
        ret +=('"w":'+this.w);
        ret +=',';
        ret +=('"h":'+this.h);
        ret +=',';
        ret +=('"x":'+this.x);
        ret +=',';
        ret +=('"y":'+this.y);
        
        
        ret +='}';
        return ret;
    }
    // 从json对象中解析
    // 参数： frame为true，表示从frame中解析（所谓frame指的是文字的每个字的x、y、w、h，但不包括文字的每个点）
    public fromJson( jsonObj, versionId ) {

        this.w = jsonObj.w * 1;
        this.h = jsonObj.h * 1;
        if ( jsonObj.hasOwnProperty( "x" ) )
            this.x = jsonObj.x;
        if ( jsonObj.hasOwnProperty( "y" ) )
            this.y = jsonObj.y;



        this.paths.splice( 0, this.paths.length );
        if ( jsonObj.hasOwnProperty( 'paths' ) ) {
            for ( var i = 0; i < jsonObj.paths.length; i++ ) {
                var path = new PointPath();
                path.fromJson( jsonObj.paths[i], versionId );
                this.paths.push( path );
            }
        }
     
        
    }
    
    // 调整复合路径，平移或者缩放
    // 参数
    //		charContour:复合路径
    //		vW:水平方向的平移值或者缩放值
    //		vH:垂直方向的平移值或者缩放值
    // 		type:类型，1 平移  2 缩放
    public adjustPosition(vW,vH, type) {
        
        if(2==type){
            this.w *= vW;
            this.h *= vH;
            this.x *= vW;
            this.y *= vH;
            
            for(var k = 0; k < this.paths.length; k++) {
                
                var pointPath = this.paths[k] ;
                pointPath.adjustPosition(vW,vH,type);
            }
        }else{
//            // 复合路径只需要平移自身的 xy即可（其子的坐标系为复合路径的左上角）
//            this.x += vW;
//            this.y += vH;
            
            // 符合路径需要处理点
            for(var k=0;k<this.paths.length;k++) {

                var pointPath=this.paths[k];
                pointPath.adjustPosition(vW,vH,type);
            }
        }
        
    }
    
    /**
 * 转换成SVG格式的字符串：
 *      'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z
 *       M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z'
 */
    public toSvgPath=function() {
        var ret="";
        for(var i=0;i<this.paths.length;i++) {
            if(i>0)
                ret+=" ";
            ret+=this.paths[i].toSvgPath(this.x,this.y,0);
        }
        return ret;
    }

    /**
        * 转换成GM使用的SVG格式的字符串：
        *     'path "M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z
        *            M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z"'
        */
    public toSvgPathForGM=function(): string {
        var ret=this.toSvgPath();
        ret='path "'+ret+'"';
        return ret;
    }
    // Y方向的中心点坐标
    public centerY():number{
        var minx: number=0,maxx: number=0,
            miny: number=0,maxy: number=0;
        for(var i=0;i<this.paths.length;i++) {
            var path: PointPath=this.paths[i];
            for(var j=0;j<path.points.length;j++){
                var pt: Point=path.points[j];
                if(i==0&& j==0){
                    minx=pt.x;
                    maxx=pt.x;
                    miny=pt.y;
                    maxy=pt.y;
                }else{
                    minx=minx<pt.x? minx:pt.x;
                    maxx=maxx>pt.x? maxx:pt.x;
                    miny=miny<pt.y? miny:pt.y;
                    maxy=maxy>pt.y? maxy:pt.y;
                }
            }
        }
        
        return (miny+maxy)/2;
    }
    
    // 复制
    public copy(): CompoundPath {
        var ret: CompoundPath=new CompoundPath();
        ret.fromJson(JSON.parse(this.toJson()),0);
        return ret;
    }
    //SJG_MARK_APPEND--------------------


}//SJG_MARK_END-------------------------

        
